#include "visualisation.h"
#include "myapplication.h"
#include <iostream>

using namespace std;
using namespace Ogre;


Visualisation::Visualisation() : myApp(NULL)
{
}

Visualisation::~Visualisation()
{
	delete myApp;
}

void Visualisation::setApplication(MyApplication * m)
{
	myApp = new MyApplication;
	myApp = m;
}

//fonction permettant d'afficher un message dans le panneau d'affichage
void Visualisation::afficherMessage ( string s )
{
    myApp->setDebugOverlay(s) ;;
}

//fonction pour tracer une ligne entre 2 objets
void Visualisation::ligne(SceneNode* sceneN,Vector3 pos1, Vector3 pos2) {
    ManualObject* myManualObject =  myApp->getSceneManager()->createManualObject("Ligne" + myApp->getNbLignes());
    SceneNode* myManualObjectNode = sceneN->createChildSceneNode("LigneNode" + myApp->getNbLignes());


    myManualObject->begin("Color/Black" , Ogre::RenderOperation::OT_LINE_LIST);
    myManualObject->position(pos1);
    myManualObject->position(pos2);
    myManualObject->end();

    myManualObjectNode->attachObject(myManualObject);

    myApp->setNbLignes(myApp->getNbLignes()+1);
}

void Visualisation::creerRacine(string nom, string nomMesh, Vector3 echelle)
{
	Entity * ent = myApp->getSceneManager()->createEntity(nom,nomMesh);
    SceneNode* node = myApp->getSceneManager()->getRootSceneNode()->createChildSceneNode(nom);
    node->scale(echelle);
    node->attachObject(ent);
	//on recupere le rayon du premier cube
    myApp->setRatio(myApp->getSceneManager()->getEntity(nom)->getBoundingRadius());
	//selection initiale
    myApp->setSelected(nom);
	this->racine=node;
}

void Visualisation::creerEntite(string nom, string nomMesh, Vector3 position)
{
	Entity * ent = myApp->getSceneManager()->createEntity(nom,nomMesh);
    SceneNode* node = this->racine->createChildSceneNode(nom,(position*FACTOR));
    node->attachObject(ent);
}

//repartit les elements horizontalement dans l'espace
//on fournira uniquement des espacements impaires
void Visualisation::repartirElements( int espacement, int nbelements, vector<int> &vectPositions)
{
	int depart;
	//repartition paire
	if (nbelements%2==0)
	{
		depart = -(((nbelements-2)/2)*espacement+(nbelements/2)+((espacement-1)/2));
		vectPositions[0]=depart;
		for (unsigned int i=1;i<vectPositions.size();i++)
		{
			vectPositions[i] = depart + i*(espacement+1);
		}
	}
	//repartition impaire
	else
	{
		depart=-(((nbelements-1)/2)*espacement+(nbelements-1)/2);
		vectPositions[0]=depart;
		for (unsigned int i=1;i<vectPositions.size();i++)
		{
			vectPositions[i] = depart + i*(espacement+1);
		}
	} 
}

//pointeurs de fonctions getFileNo ou getFolderNo ...

void Visualisation::creerReprTest()
{
	Folder * f = new Folder("/home/lionel/Desktop/TC5-TER/TestFichiers/"); 

	//test de la fonction de repartition
	vector<int> vectPos(5);
	repartirElements(1,5,vectPos);
	ostringstream oss; 
	for (unsigned int i=0;i<vectPos.size();i++)
	{
		oss << "elt "<< i << " : " << vectPos[i] << endl;
	}
	afficherMessage(oss.str());

	creerRacine("/home/lionel/Desktop/TC5-TER/TestFichiers/","CubeBlue.mesh",Vector3(SCALE,SCALE,SCALE));
	creerEntite(((*f).getFolderNo(0))->getNom(),"CubeGreen.mesh",Vector3(vectPos[4],1,0));
	ligne(getRacine(),getRacine()->getPosition(),getNoeud(((*f).getFolderNo(0))->getNom())->getPosition());

	for(int i=0;i<4;i++)
	{
		creerEntite(((*f).getFileNo(i))->getNom(),"SphereYellow.mesh",Vector3(vectPos[i],1,0));
		ligne(getRacine(),getRacine()->getPosition(),getNoeud(((*f).getFileNo(i))->getNom())->getPosition());
	}
	f=NULL;
}

//fonction pour ajouter un objet a la scene
/*void Visualisation::attachEntity(Entity * entity, SceneNode * sceneNode, Vector3 vScale, Vector3 vTrans)
{
    sceneNode->scale(vScale);
    sceneNode->translate(vTrans);
    sceneNode->attachObject(entity);
}*/

//getters
SceneNode * Visualisation::getNoeud(String name)
{
	return myApp->getSceneManager()->getSceneNode(name);
}

SceneNode * Visualisation::getRacine()
{
	return this->racine;
}
